package aceim.app.view.page.chat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import aceim.app.Constants; import aceim.app.MainActivity; import aceim.app.R; import aceim.app.dataentity.GlobalOptionKeys; import aceim.app.dataentity.SmileyResources; import aceim.app.utils.ViewUtils; import aceim.app.widgets.HorizontalListView; import aceim.app.widgets.adapters.SingleViewAdapter; import aceim.app.widgets.adapters.SingleViewAdapter.OnSingleViewAdapterItemClickListener; import android.content.Context; import android.graphics.Rect; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.GridView; import android.widget.PopupWindow; import android.widget.TextView; public class SmileysPopup { private int mSoftKbHeight = 0; private final MainActivity mActivity; private PopupWindow mPopupWindow; private EditText mEditor; private View mSmileysView; private final boolean mDontDrawSmileys; private final OnSingleViewAdapterItemClickListener mSmileyClicklistener = new OnSingleViewAdapterItemClickListener() { @Override public void onItemClick(SingleViewAdapter<?, ?> adapter, int position) { if (adapter instanceof ImageSmileyAdapter) { ViewUtils.insertToEditor(((ImageSmileyAdapter) adapter).getItemName(position), mEditor); } else { ViewUtils.insertToEditor(adapter.getItem(position).toString(), mEditor); } } }; private final Runnable mShowPopupRunnable = new Runnable() { @Override public void run() { Rect rect = new Rect(); mActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); boolean showInsteadOfKeyboard = showInsteadOfKeyboard(); if (showInsteadOfKeyboard) { mPopupWindow.setHeight(getPossibleKeyboardHeight()); mPopupWindow.showAtLocation(mActivity.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0); mPopupWindow.getContentView().setPadding(0, 0, 0, 0); } else { mSoftKbHeight = rect.height() - mEditor.getHeight(); mPopupWindow.setHeight(mSoftKbHeight); mPopupWindow.showAtLocation(mActivity.getWindow().getDecorView(), Gravity.TOP, rect.left, rect.top); } HorizontalListView tabsView = (HorizontalListView) mSmileysView.findViewById(R.id.tab_selector); List<SmileyResources> smileys = new ArrayList<SmileyResources>(mActivity.getSmileysManager().getUnmanagedSmileys()); Collections.reverse(smileys); tabsView.setAdapter(new SmileyResourcesAdapter(mActivity, smileys)); tabsView.getAdapter().notifyDataSetChanged(); if (smileys.size() < 2) { tabsView.getLayoutParams().height = 0; } else { tabsView.getLayoutParams().height = LayoutParams.WRAP_CONTENT; } mSmileysView.requestLayout(); setSelected(smileys.get(0)); } }; public SmileysPopup(MainActivity activity) { this.mActivity = activity; mDontDrawSmileys = activity.getSharedPreferences(Constants.SHARED_PREFERENCES_GLOBAL, 0).getBoolean(GlobalOptionKeys.TEXT_SMILEYS.name(), Boolean.parseBoolean(activity.getString(R.string.default_text_smilies))); init(); } private void init() { mSmileysView = LayoutInflater.from(mActivity).inflate(R.layout.smileys_view, null); } public void show(EditText editText) { if (editText == null) { if (isShown()) { hide(); } return; } mEditor = editText; if (mPopupWindow == null) { mPopupWindow = new PopupWindow(mActivity); mPopupWindow.setContentView(mSmileysView); mPopupWindow.setBackgroundDrawable(null); mPopupWindow.setWidth(mActivity.getWindow().getDecorView().getWidth()); mPopupWindow.setHeight(mActivity.getWindow().getDecorView().getHeight() / 2); } mActivity.runOnUiThread(mShowPopupRunnable); } private boolean showInsteadOfKeyboard() { return getPossibleKeyboardHeight() > 100; } private int getPossibleKeyboardHeight() { int viewHeight = mActivity.getScreen().getHeight(); int screenHeight = mActivity.getResources().getDisplayMetrics().heightPixels; int statusBarHeight = mActivity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); return screenHeight - viewHeight - statusBarHeight; } private void setSelected(SmileyResources sr) { if (sr == null) return; ViewGroup container = (ViewGroup) mSmileysView.findViewById(R.id.fragment_holder); HorizontalListView tabsView = (HorizontalListView) mSmileysView.findViewById(R.id.tab_selector); container.removeAllViews(); container.addView(getContentView(sr)); tabsView.setSelected(sr); } public void hide() { if (mPopupWindow != null && mPopupWindow.isShowing()) { try { mPopupWindow.dismiss(); } catch (Exception e) { //Sometimes thrown during orientation changes } //mPopupWindow = null; } } public boolean isShownForThisEditor(EditText editor) { return mEditor == editor && mPopupWindow != null && mPopupWindow.isShowing(); } private View getContentView(SmileyResources resources) { GridView grid = new GridView(mActivity); grid.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); grid.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM); grid.setNumColumns(GridView.AUTO_FIT); grid.setStretchMode(GridView.STRETCH_SPACING_UNIFORM); grid.setColumnWidth(mActivity.getResources().getDimensionPixelSize(R.dimen.default_smiley_size)); if (grid.getTag() == null || grid.getTag() != resources) { SingleViewAdapter<?, ?> adapter = mDontDrawSmileys ? TextSmileyAdapter.fromStringList(mActivity, Arrays.asList(resources.getNames())) : ImageSmileyAdapter.fromSmileyResources(mActivity, resources); grid.setAdapter(adapter); grid.setTag(resources); adapter.setOnItemClickListener(mSmileyClicklistener); } return grid; } private class SmileyResourcesAdapter extends ArrayAdapter<SmileyResources> { public SmileyResourcesAdapter(Context context, List<SmileyResources> objects) { super(context, 0, 0, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { SmileyResources resources = getItem(position); TextView text; if (convertView == null) { text = (TextView) LayoutInflater.from(getContext()).inflate(R.layout.smiley_tab_indicator, null); } else { text = (TextView) convertView; } if (text.getTag() == null || text.getTag() != resources) { text.setTag(resources); text.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setSelected((SmileyResources) v.getTag()); } }); } text.setText(resources.getSmileyPackShortName()); return text; } } public boolean isShown() { return mPopupWindow != null && mPopupWindow.isShowing(); } }